博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
小程序调用阿里云身份证识别OCR(附带七牛云上传图片)
阅读量:5951 次
发布时间:2019-06-19

本文共 12086 字,大约阅读时间需要 40 分钟。


  • 写在前面:
  • 实现的逻辑是拍照上传调用后端封装好的身份证接口,然后同时调用七牛云接口把照片传过去以便后台管理系统审核看
  • 1:首选需要这么一张页面

图片描述

  • 接下来就写我是怎么做的

首先是布局(以下是wxml)

扫描身份证人像面
扫描身份证国徽面
下一步

接着来写样式,要来就来全套不是,哈哈哈

/* pages/idcard/index.wxss */.idcard {  text-align: center;  margin: 100rpx auto;}.logo_disabled {  /* background: #FADFCB; */  background: rgba(255, 173, 118, 0.40);}.logo_bg {  background: #ffad76;}.idcard_front, .idcard_con {  height: 370rpx;  width: 580rpx;}.myCanvas {  width: 600rpx;  height: 450rpx;  visibility: hidden;  position: absolute;}.judgeCanvas {  width: 2px;  height: 2px;  visibility: hidden;}.idcard_front_desc{  font-size: 30rpx;  color: #666666;  margin-top: 20rpx;}.submit {  height: 80rpx;  width: 622rpx;  line-height: 80rpx;  border-radius: 40rpx;  text-align: center;  color: #fff;  font-size: 32rpx;  margin: 50rpx auto 40rpx;  /* background: #ffad76; */}

接着就是最重要的js了(我直接全选复制,各位见谅,封装的七牛云上传和wx.request在下面?)

// pages/idcard/index.jsconst util = require('../../utils/util.js');const qiniuUploader = require("../../utils/qiniuUploader");import api from '../../utils/api.js';const apiurl = 'https://yuesao.wutongdaojia.com';const imgPath = 'https://cdn.wutongdaojia.com/';Page({  /**   * 页面的初始数据   */  data: {    x: 0,    y: 0,    areaWith: 750,    areaHeight: 750,    idCardUrlFront: '../../imgs/front.png',    idCardUrlBack: "../../imgs/back.png",    imagewidth: '',    imageheight: '',    base64: '',    islogo:false,    headerImage: '',    picValue: '',    showMagnifyIdCard: false,    hasServerMsg: false,    auth: {},    // android: util.browser.versions.android  },  /**   * 生命周期函数--监听页面初次渲染完成   */  onReady: function() {    // helper.checkOrientation('judgeCanvas');  },  uploadImageFront() {    var that = this    // front 代表正面    that.checkIdCard(that, 'front', function(res) {      wx.setStorageSync('address', res.address)      wx.removeStorageSync('cardErrFront')      wx.setStorage({        key: 'idcardFront',        data: {          address: res.address,          birthday: res.birthday,          code: res.code,          name: res.name,          nation: res.nation,          sex: res.sex,        }      })      that.checkIsSuc()    })  },  uploadImageBack() {    var that = this     // back 代表反面    that.checkIdCard(that, 'back', function(res) {      wx.setStorageSync('issue', res.issue)      wx.removeStorageSync('cardErrBack')      wx.setStorage({        key: 'idcardBack',        data: {          expiryDate: res.expiryDate, // 结束日期          issue: res.issue, //签发籍贯          issueDate: res.issueDate, // 开始日期        }      })      that.checkIsSuc()    })  },  checkIsSuc() {    var that = this    var address = wx.getStorageSync('address')    var issue = wx.getStorageSync('issue')    if (address && issue) {      that.setData({        islogo: true      })    }  },  checkIdCard(that, type, callback) {    util.getUploadToken()    wx.chooseImage({      count: 1, // 默认9      sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有      sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有      success: function(res) {        // 返回选定照片的本地文件路径列表,tempFilePath可以作为img标签的src属性显示图片        var tempFilePaths = res.tempFilePaths;        that.qiniuUploader(that, tempFilePaths[0], function(res) {          console.log(res)          if (type == "front") {            that.setData({              idCardUrlFront: imgPath + res.key            })            wx.setStorageSync('idCardFrontUrl', imgPath + res.key)            that.uploadFile(that, type, tempFilePaths, that.data.idCardUrlFront, function(res) {              console.log(res)              callback(res)            })          } else {            that.setData({              idCardUrlBack: imgPath + res.key            })            wx.setStorageSync('idCardBackUrl', imgPath + res.key)                        that.uploadFile(that, type, tempFilePaths, that.data.idCardUrlBack, function(res) {              console.log(res)              callback(res)            })          }        })        // that.getIdcardInfo('front')      }    })  },  qiniuUploader(that, filePath, callback) {    qiniuUploader.upload(filePath, (res) => {        console.log(res)        callback(res)      }, (error) => {        console.error('error: ' + JSON.stringify(error));      },      null, // 可以使用上述参数,或者使用 null 作为参数占位符      (progress) => {        // console.log('上传进度', progress.progress)        // console.log('已经上传的数据长度', progress.totalBytesSent)        // console.log('预期需要上传的数据总长度', progress.totalBytesExpectedToSend)      }, cancelTask => that.setData({        cancelTask      })    )  },  /*图片上传*/  uploadFile(that, idCardSide, files, idCardUrl, callback) {    wx.uploadFile({      url: apiurl + '/weixin/getIdcardInfo', //里面填写你的上传图片服务器API接口的路径       filePath: files[0], //要上传文件资源的路径 String类型       name: 'file', //按个人情况修改,文件对应的 key,开发者在服务器端通过这个 key 可以获取到文件二进制内容,(后台接口规定的关于图片的请求参数)      header: {        "Content-Type": "multipart/form-data" //记得设置        // "Content-Type": "image/jpeg" //记得设置      },      formData: {        //和服务器约定的token, 一般也可以放在header中        'token': wx.getStorageSync('token'),        'idCardSide': idCardSide,        'idCardUrl': idCardUrl      },      success: function(res) {        //当调用uploadFile成功之后,再次调用后台修改的操作,这样才真正做了修改头像        console.log(JSON.parse(res.data))        var responce = JSON.parse(JSON.parse(res.data).data)        if (res.status = 200) {          if (responce.code == 1) {            callback(responce.result)          } else {            wx.showToast({              title: responce.msg,              icon: 'none',              duration: 1000            })            if (idCardSide =="front"){              wx.setStorageSync('cardErrFront', responce.msg)            }else{              wx.setStorageSync('cardErrBack', responce.msg)            }            return          }        } else {          wx.showToast({            title: responce.msg,            icon: 'none',            duration: 1000          })          return        }      }    })  },  submit() {    var address = wx.getStorageSync('address')    var issue = wx.getStorageSync('issue')    var cardErrFront = wx.getStorageSync('cardErrFront')    var cardErrBack = wx.getStorageSync('cardErrBack')    if(!this.data.islogo) return    // debugger    if (cardErrFront) {      wx.showToast({        title: '人像面'+cardErrFront+',请重新上传',        icon: 'none',        duration: 1000      })      return    } else if (cardErrBack){      wx.showToast({        title: '国徽面' + cardErrBack + ',请重新上传',        icon: 'none',        duration: 1000      })      return    } else if (!address) {      wx.showToast({        title: '请上传身份证人像面',        icon: 'none',        duration: 1000      })      return    } else if (!issue) {      wx.showToast({        title: '请上传身份证国徽面',        icon: 'none',        duration: 1000      })      return    } else {      wx.navigateTo({        url: '../editcard/index',      })    }  },  /**   * 生命周期函数--监听页面加载   */  onLoad: function(options) {    wx.removeStorageSync('address')    wx.removeStorageSync('issue')    wx.removeStorageSync('cardErrFront')    wx.removeStorageSync('cardErrBack')    wx.removeStorage({      key: 'idcardFront',      success: function(res) {        console.log(res)      },    })    wx.removeStorage({      key: 'idcardBack',      success: function(res) {        console.log(res)      },    })  },  /**   * 生命周期函数--监听页面显示   */  onShow: function() {  },  /**   * 生命周期函数--监听页面隐藏   */  onHide: function() {  },## 标题文字 ##  /**   * 生命周期函数--监听页面卸载   */  onUnload: function() {  },  /**   * 页面相关事件处理函数--监听用户下拉动作   */  onPullDownRefresh: function() {  },  /**   * 页面上拉触底事件的处理函数   */  onReachBottom: function() {  },  /**   * 用户点击右上角分享   */  onShareAppMessage: function() {  }})

封装wx.request来了(api.js)

/** 使用方法 *@method ajax *@param{参数类型}参数名 参数说明 * Type:请求类型(get、post) * params:请求参数 * url:请求地址 */// http('dataUrl', param).then(res => {//       ...//     })const ajax = (Type, params, url) => {  var methonType = "application/json";  // var https = "http://www.wutongdaojia.com"  var https = "https://yuesao.wutongdaojia.com"  var st = new Date().getTime()  if (Type == "POST") {    methonType = "application/x-www-form-urlencoded"  }  return new Promise(function (resolve, reject) {    wx.request({      url: https + url,      method: Type,      data: params,      header: {        'content-type': methonType,        'Muses-Timestamp': st,        'version': 'v1.0' // 版本号        // 'Muses-Signature': sign      },      success: function (res) {        // if (res.statusCode != 200) {        //   reject({ error: '服务器忙,请稍后重试', code: 500 });        //   return;        // }        // resolve(res.data);        wx.hideLoading()        console.log(res)        if (res.data.status == 200) {          resolve(res.data);        } else if (res.data.status == 400) {          wx.showToast({            title: res.data.message,            icon: 'none',            duration: 1000          })          return        } else if (res.data.status == 401){          wx.removeStorageSync('phone')          wx.removeStorageSync('token')          wx.showToast({            title: res.data.message,            icon: 'none',            duration: 1000,            success:function(){              wx.navigateTo({                url: '../login/index',              })            }          })          return        } else {          //错误信息处理          wx.showToast({            title: '服务器错误,请联系客服',            icon: 'none',            duration: 1000          })        }      },      fail: function (res) {        // fail调用接口失败        reject({ error: '网络错误', code: 0 });      },      complete: function (res) {        // complete      }    })  })}module.exports = {  ajax: ajax}

util.js

const qiniuUploader = require("./qiniuUploader");import api from './api.js';const getUploadToken = () => {  var params = {    token: wx.getStorageSync('token')  }  api.ajax("GET", params, "/weixin/getUploadToken").then(res => {    console.log(res.data)    initQiniu(res.data)  });}// 初始化七牛相关参数const initQiniu = (uptoken) => {  var options = {    region: 'NCN', // 华北区    // uptokenURL: 'https://[yourserver.com]/api/uptoken',    // cdn.wutongdaojia.com    // uptokenURL: 'http://upload-z1.qiniup.com',    // uptokenURL: 'https://yuesao.wutongdaojia.com/weixin/getUploadToken',    // uptoken: 'xxx',    uptoken: uptoken,    // domain: 'http://[yourBucketId].bkt.clouddn.com',    domain: 'image.bkt.clouddn.com',    shouldUseQiniuFileName: false  };  qiniuUploader.init(options);}export function didPressChooesImage(that, count, callback) {  getUploadToken();  // 微信 API 选文件  wx.chooseImage({    count: count,    success: function(res) {      console.log(res)      var filePath = res.tempFilePaths[0];      console.log(filePath)      callback(filePath)      // 交给七牛上传    }  })}/** * 文件上传 * 服务器端上传:http(s)://up.qiniup.com * 客户端上传: http(s)://upload.qiniup.com * cdn.wutongdaojia.com */function uploader(file, callback) {  initQiniu();  qiniuUploader.upload(filePath, (res) => {      // 每个文件上传成功后,处理相关的事情      // 其中 info 是文件上传成功后,服务端返回的json,形式如      // {      //    "hash": "Fh8xVqod2MQ1mocfI4S4KpRL6D98",      //    "key": "gogopher.jpg"      //  }      // 参考http://developer.qiniu.com/docs/v6/api/overview/up/response/simple-response.html      that.setData({        'imageURL': res.imageURL,      });    }, (error) => {      console.log('error: ' + error);    },    // , {    //     region: 'NCN', // 华北区    //     uptokenURL: 'https://[yourserver.com]/api/uptoken',    //     domain: 'http://[yourBucketId].bkt.clouddn.com',    //     shouldUseQiniuFileName: false    //     key: 'testKeyNameLSAKDKASJDHKAS'    //     uptokenURL: 'myServer.com/api/uptoken'    // }    null, // 可以使用上述参数,或者使用 null 作为参数占位符    (res) => {      console.log('上传进度', res.progress)      console.log('已经上传的数据长度', res.totalBytesSent)      console.log('预期需要上传的数据总长度', res.totalBytesExpectedToSend)    });};module.exports = {  initQiniu: initQiniu,  getUploadToken: getUploadToken,  didPressChooesImage: didPressChooesImage}
  • 如需帮助请加微信(18310911617)
    备注:说明来意

转载地址:http://vxsxx.baihongyu.com/

你可能感兴趣的文章
C#从SQL server数据库中读取l图片和存入图片
查看>>
paip.自适应网页设计 跟 响应式 设计的区别跟原理and实践总结
查看>>
Frameworks 目录
查看>>
spring扩展点之四:Spring Aware容器感知技术,BeanNameAware和BeanFactoryAware接口,springboot中的EnvironmentAware...
查看>>
Android -- SharedPreferences存储信息
查看>>
C++的函数重载和main函数之外的工作
查看>>
js中的hasOwnProperty和isPrototypeOf方法
查看>>
杂七杂八的面试概念
查看>>
[游戏学习29] Win32 图像处理1
查看>>
递归算法浅谈
查看>>
赵雅智_ListView_BaseAdapter
查看>>
NoSQL数据库:数据的一致性
查看>>
20款优秀的国外 Mobile App 界面设计案例
查看>>
github简单使用教程
查看>>
ExtJS4.1 ExtJS TabPanel 双击标签关闭该页
查看>>
手绘彩色光圈
查看>>
高并发高流量网站架构(转)
查看>>
使用instantclient_11_2 和PL/SQL Developer工具包连接oracle 11g远程数据库(转)
查看>>
娓娓道来c指针 (0)c语言的梦魇:c指针
查看>>
二八原则
查看>>